简答

1. 开发模式,开发软件的特点,概念

  1. 独立开发:
    • 定义:不依赖于任何GIS工具软件,从空间数据的采集、编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计,然后选用某种程序设计语言,如VC++、VB、Delphi、C++ Builder等,在一定的操作系统平台上编程实现。
    • 特点:
      • 无需依赖任何商业GIS工具软件,减少了开发成本
      • 综合程度和操作效率最高
  2. 单纯二次开发:
    • 定义:在宏语言中调用DLL库,定义GIS系统工具不提供或不支持的功能,
    • 特点:
      • 功能弱,程序不美观,开发收到限制
      • 增加学习负担
  3. 集成二次开发:
    • 定义:利用专业GIS工具软件或其提供的组件来实现GIS的基本功能,采用可视化开发工具,进行集成开发。集成二次开发目前主要有OLE/DDE方式和组件式方式两种。
    • 特点:
      • GIS工具软件能够提供成熟的功能。例如:空间数据库存储、空间分析等
      • 高效,便捷,不需要从底层学习具体的实现原理,易上手。
1. 基于arcengine或者arcobject 
2. 基于com(原理)

2. 接口及类:特,用,概,接口应用

接口的特点:

1. 接口的多态性:许多不同的类可以支持相同的接口
2. 接口的继承性:所有的子类都继承了父类的接口

面向接口编程:

  • 接口定义了能做什么,类定义了该怎么做。类实现了接口中的方法。

  • 接口描述了一系列外部可见操作

  • 接口具有类内置的一组属性和方法

    Com类代码:

  • 接口模块:定义方法和属性

  • 类模块:实现方法和属性

    COM 对象的接口是抽象的,接口与类不同。因为接口没有 任何的实现,所以不能通过自身实例化。因为接口没有任何的实现,所以不能通过自身实例化。接口由具体的类来实现由具体的类来实现,功能用接口抽象地模拟,并且用类去真正实现。

    地图接口
    1. ILayer接口:所有图层类都可以实现该接口,定义了所有图层公共的方法和属性。
      • Name属性:返回图层名称;
      • MaximumScale属性:显示或设置图层可以出现的最大比例尺;
      • MinmumScale属性:显示或设置图层可以出现的最小比例尺;
      • ShowTips属性:指示当鼠标放在图层中某个要素上时,是否出现Tips;
      • SpatialReference属性:设置图层的空间参考。
    2. IFeatureLayer接口:主要用于设置要素图层的数据源(FeatureClass)
      • DataSourceType属性:返回图层的数据源类型;
      • Search方法:通过2个参数,过滤器(IQueryFilter类型的对象)和布尔值(用于返回要素游标是否循环,返回一个Icursor对象)

    IFeatureLayer接口继承自Ilayer接口,IFeatureClass接口继承自Iclass接口。

    FeatureLayer可以创建自己的对象,FeatureClass不行

  1. Version类库:ArcEngine 10.0新出的类库,包含里将独立应用程序绑定到特定的ArcGIS系列产品的函数和方法。

  2. System:ystem库是ArcGIS框架中最底层的一个库,它包含了一些被其他库使用的一些基础组件。

  3. SystemUI:SystemUI库定义了一些在ArcGIS中被用户界面组件使用的类型。象ICommand和ITool这样的接口就在这里定义。

  4. Geometry:几何库包含了核心的几何对象,比如点,面,线等。在几何库中还定义和实现了空间参考的对象,包括投影坐标系和几何坐标系。

  5. Display:显示库包含了支持在输出设备上显示图形的组件,屏幕显示、符号、颜色、显示交互(Feedback)等都在这个库中定义。

  6. Server:提供了连接、管理ArcGIS Server的核心类,如IServerObjectManager、IServerObject等,其他类库的对象可以通过ArcGIS Server的IServerContext进行远程创建。

  7. Output:提供了将MapControl和PagelayoutControl中的地图输出到打印机以及其他设备文件中。

3. 对象模型图:类和关系,分别有什么特点

    • 抽象类:不能用于创建对象,对子类例程进行了规定(通过类型继承)。
    • 普通类:不能直接创建对象,但可以作为另一个类的属性或者通过另一个类的实例化来创建对象。
    • 组件类:可以直接创建对象。
  1. 关系

    • 关联关系:表示类之间的关系。关联的两端都定义了多样性。

    • 组成关系:是一种“整体类”对象控制着“部分类”对象的生命期关系。

    • 类型继承关系:定义共享父类的属性和方法,同时又具有了自己独特的属性和方法的特定对象类。

    • 实例化关系:表示某个类的对象具有创建另一个类的对象的方法。

    • N元关系:表示两个以上的类相互关联。在各个关联分支的交叉点上放置一个菱形。

    • 多样性关系:是对能于另一个对象关联的对象数目的一种限制。关联和组成关系的两端都定义了多样性。

    抽象类(AbstractClass):
    1. 不能创建或实例化

      1. 抽象类永远不能有实例
    2. 为子类定义了泛化(general)

      1. 子类集成了抽象类的接口

      抽象类的OMD 符号: 2维灰色矩形

    普通类/可实例化类 (Class)
    1. 不能创建或实例化

    2. 抽象类永远不能有实例

    3. 为子类定义了泛化(general)

    4. 子类集成了抽象类的接口

      IRow pNewRow;

      ITable  pTable;

      pNewRow = pTable.CreateRow();

      IRow row = table.CreateRow();

      实例化类的OMD符号: 3维白色的矩形

    组件类/可创建的类(CoClass)
    1. 可以创建:使用 New关键字

      1
      IMap pmap = new Map();
    2. 实例化: 从其它对象获得

      1
      2
      Imap pMap;
      pMap = m_MapDocument.get_Map(i);

      可创建类的OMD符号:3维灰色矩形

  2. AE控件有哪些,分类特点

    1. 制图控件: MapControl 和PageLayoutControl
    2. 框架控件: TOCControl(内容表控件) 和ToolbarControl(工具条控件)–(buddy控件捆绑)
    3. 许可控件:LicenseControl(启动时执行License初始化)
    4. 符号控件:SymbologyControl
    5. Reader Control: ReaderControl和ReaderControl
    6. 三维控件:GlobeControl和SceneControl
  3. 矢量数据集相关类的关系

    1. 矢量数据数据的加载,分析,查询

    接口:

    1. **IWorkspaceFactory**:创建工作工厂
    
    2. **IWorkspace**:工作化工作空间
       3. **IFeatureWorkspace**:接口转换为要素工作空间
       4. **IFeatureClass**:创建featureClass
       5. **IFeatureLayer**:创建要素图层
       6. **IMap**:接收AxMapControl中的地图对象

    类:

    1. ShapefileWorkspaceFactory:作为子类创建工作空间
    2. FeatureLayer:创建要素图层用于接收打开的shpfile文件的featureClass,作为图层,只是表现形式,真正的数据在FeatureClass中。
    3. FeatureClass是从Dataset继承过来的,FeatureClass是有空间数据字段的数据集。

程序流程(简答)

1. 数据访问,添加矢量

矢量加载:

  1. 获取文件路径和文件名称
  2. 创建地理空间工厂WorkspaceFactory(怎么创建)
  3. 实例化地理空间Workspace(怎么实例化)
  4. 获取FeatureClass
  5. 创建要素图层FeatureLayer
  6. 为要素图层定义数据集FeatureClass
  7. 添加至地图控件
  8. 刷新地图视图
2. 空间数据显示—图层渲染
1. 抽象类:Symbol,MarkerSymbol,LineSymbol,FillSymbol
2. 组件类:
       1. RgbColor:颜色
       2. SimpleMarkerSymbol,SimplelineSymbol,SimplefillSymbol:简单点线面符号
       3. SimpleRenderer:简单渲染
  1. 实例化ISimpleMarkerSymbol,提供简单点符号
  2. 实例化ISimpleRenderer,提供简单渲染器
  3. 获取渲染图层赋值给IGeoFeatureLayer,提供要素图层对成员控制地理特征渲染的入口,获取渲染图层
  4. 调用pGeoFeatureLayer.Renderer属性赋值渲染器
  5. 刷新地图视图
3. 元素添加至地图
  1. 获取pagelayerout对象、活动视图pActiveView、图形容器pGraphicsContainer、地图窗口MapFrame
  2. 创建UID对象,设置value
  3. 通过MapFrameCreateSurroundFrame(uid,null)方法创建mapSurroundFrame
  4. 实例化一个区域几何envelope(包裹元素的盒子)。通过PutCoords(xmin, ymin, xmax, ymax)方法设置地图上的位置
  5. 通过mapSurroundFrame获取Element,设置框架的几何体属性Geometry为区域几何对象envelope
  6. 通过图形容器pGraphicsContainerAddElement(Element,ZOrder)方法把地图要素添加地图布局。
  7. 刷新视图。

接口:

  1. IGraphicsContainer:管理map上的Element对象,获取图形容器
  2. IMapFrame:访问控制地图元素对象的成员
  3. IMapSurroundFrame:获取或更新存储在帧中的环绕对象(指北针、比例尺条或图例)
  4. IEnvelope:地物的外接矩形,用来放置元素。
  5. IElement:通过这一属性设置该元素的外接矩形在地图上的位置。所有图形元素和框架元素都实现的接口,可以确定元素的Geometry属性。

类:

  1. UID用来设置元素类型的编码
  2. MapFrame: 用于显示地图的图形元素。
  3. MapSurroundFrame:用于显示地图包围的图形元素。
  4. Envelope:包络线,是每个几何形体的最小外接矩形。每个Geometry都拥有一个Envelope
  5. Element:抽象类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void add(string value,double xmin,double ymin, double xmax, double ymax)
{
//获取图形容器
IGraphicsContainer graphicsContainer = pageLayoutControl.PageLayout as IGraphicsContainer;

//根据MapSurround的uid,创建相应的MapSurroundFrame和MapSurround
UID uid = new UID();
uid.Value = value;
IMapFrame mapFrame = pageLayoutControl.PageLayout as IMapFrame;
IMapSurroundFrame mapSurroundFrame = mapFrame.CreateSurroundFrame(uid, null);

//为要素实例化一个区域几何。元素的外接矩形
envelope = new Envelope() as IEnvelope;
envelope.PutCoords(xmin, ymin, xmax, ymax);

//获取Element,用来设置框架的几何体属性
IElement eement = mapSurroundFrame as IElement;

//geometry属性控制区域几何在地图上的位置
element.Geometry = envelope;

graphicsContainer.AddElement(element, 0);
activeView.Refresh();
pagelayoutcontrol.Refresh();
}
4. 属性查询
步骤:
  1. 获取数据源FeatureClass
  2. 循环给每一列写字段名
  3. 获取查询返回的游标,null代表没有查询条件,返回整个表
  4. IFeature接收指针指向的数据
  5. 将指针指向第一个要素属性行
  6. 如果pFeature不为空则循环7,8,9步
  7. 获取表中的新行,并将引用赋值给DataRow
  8. 为每一个属性单元格赋值
  9. 游标指向下一行要素并重新赋值给pFeature
  10. DataTable赋值给dataGridView的数据源
类:
  1. QueryFilter:过滤数据通过属性值或者属性之间的关系
  2. QueryDef:代表了数据库中基于一个或多个表、要素类的进行的属性查询,通过这个对象,用户可以在多个表间建立连接,并且保证在这个连接基础上的查询可以实现。
  3. FeatureCursor:普通类,通过pFeatureClass.Search(filter, false);实例化
接口:
  1. IFeatureClass:数据源
  2. IQueryFilter:用于属性查询
  3. IFeatureCursor:查询返回的游标
  4. IFeature:要素,返回游标中要素集单位
5. 空间查询
步骤:
  1. 获取pFeatureLayer
  2. 实例化过滤器pSpatialFilter
  3. 创建geometry,用来装载框选范围
  4. 将框选几何geometry赋给pSpatialFilter
  5. 设置空间范围的查询条件(从空间查询窗体获得)
  6. 实例化查询接口pfeatureSelection
  7. 调用查询方法SelectFeatures(过滤器, esriSelectionResultEnum.esriSelectionResultNew, false);实现高亮
  8. 刷新图层
接口:
  1. IFeatureLayer:当前的要素图层,用于接口转换
  2. ISpatialFilter:过滤器,用来设置空间范围的查询条件
  3. IGeometry:几何类型,获取框选范围
  4. IFeatureSelection:查询接口,用于查询,没有返回值,实现高亮
类:
  1. FeatureLayer:组件类,要素图层
  2. SpatialFilter:组件类,过滤器
  3. Geometry:普通类,通过mapControl.TrackRectangle();实例化,几何类型

程序设计题

1. 面向接口的编程及接口转换

2. 接口的继承

3. 图层的显示及渲染

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
///
//Shp
///
OpenFileDialog pOpenfileDialog = new OpenFileDialog();
if (pOpenfileDialog.ShowDialog() == DialogResult.OK)
{
string path = pOpenfileDialog.FileName;
bool shp = path.EndsWith(".shp");
if (shp)
openShpFile(path);
}
private void openShpFile(string file)
{
int index = 0;
//获取最后一个“\\”时的索引位置
index = file.LastIndexOf("\\");
//获得shp文件的路径
string filePath = file.Substring(0, index);
//获得shp文件名
string fileName = file.Substring(index + 1, file.Length - (index + 1));
//由工作空间工厂创建shp工作空间工厂类
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
//打开工作空间
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(filePath, 0);
//转换工作空间为要素工作空间
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
//打开要素类
IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass(fileName);
//创建要素图层
IFeatureLayer pFLayer = new FeatureLayer();
//设置图层的featureclass为上面打开的文件
pFLayer.FeatureClass = pFC;
//设置图层的名称
pFLayer.Name = pFC.AliasName;
//转换featurelayer为layer
ILayer pLayer = pFLayer as ILayer;
IMap pMap = mapControl.Map;
//添加图层
pMap.AddLayer(pLayer);
//刷新
mapControl.ActiveView.Refresh();
}


///
//渲染
///

//简单渲染,点符号
public static void easy_point(string filename, IRgbColor point_rgb, int width)
{
//实例化ISimpleFillSysmbol变量, 提供简单的填充符号类型
ISimpleMarkerSymbol pSimplemarkerSymbol = new SimpleMarkerSymbol();
pSimplemarkerSymbol.Color = point_rgb;
pSimplemarkerSymbol.OutlineSize = width;
//实例化简单渲染变量
ISimpleRenderer pSimpleRender = new SimpleRenderer();
//设置pSimpleRender的符号样式
pSimpleRender.Symbol = pSimplemarkerSymbol as ISymbol;
Render_tool(pSimpleRender, filename);
}
private static void Render_tool(ISimpleRenderer pSimpleRenderer, string filename)
{
//提供要素图层对成员控制地理特征渲染的入口,获取渲染图层
IGeoFeatureLayer pGeoFeatureLayer = getGeoLayer(filename);
if (pGeoFeatureLayer != null)
//调用Renderer属性, 具体说明如何通过图层要素渲染器渲染图层
pGeoFeatureLayer.Renderer = pSimpleRenderer as IFeatureRenderer;
mapControl.ActiveView.Refresh();
}
public static IGeoFeatureLayer getGeoLayer(string layerName)
{
ILayer pLayer; //定义图层
IGeoFeatureLayer pGeoFeatureLayer; //定义要素图层
for (int i = 0; i < CSR_mapControl.LayerCount; i++)
{
pLayer = CSR_mapControl.get_Layer(i);
//若当前图层不为空且与与layerName的值相同
if (pLayer != null && pLayer.Name == layerName)
{
pGeoFeatureLayer = pLayer as IGeoFeatureLayer;
return pGeoFeatureLayer;
}
}
return null;
}

///
//Tiff
///

//工作空间实例化
IWorkspaceFactory pRasterWsF = new RasterWorkspaceFactory();
IWorkspace pWs = pRasterWsF.OpenFromFile(RasterPath, 0);
IRasterWorkspace pRasterWs = pWs as IRasterWorkspace;
IRasterDataset pRasterDS = pRasterWs.OpenRasterDataset(RasterName);
//影像金字塔的判断和创建
IRasterPyramid pRasterPyramid = pRasterDS as IRasterPyramid;
if ((pRasterPyramid != null) && (!pRasterPyramid.Present))
{
pRasterPyramid.Create();
}
//新建栅格图层
IRasterLayer pRasterLayer = new RasterLayer();
pRasterLayer.CreateFromRaster(pRasterDS.CreateDefaultRaster());
IMap pmap = mapControl.Map;
//加载显示
pmap.AddLayer(pRasterLayer);
mapControl.ActiveView.Refresh();

4. 属性查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static DataTable getFeatureLayerTable(IFeatureLayer pFeatureLayer)
{
//获取数据源FeatureClass
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
DataTable dt = new DataTable();
for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
{
//循环给每一列写字段名
dt.Columns.Add(pFeatureClass.Fields.get_Field(i).Name);
}
//获取查询返回的游标,null代表没有查询条件,返回整个表
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
//将指针指向第一个要素属性行
IFeature pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
//获取表中的新行,并将引用赋值给DataRow
DataRow dataR = dt.Rows.Add();
for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)
{
//为每一个属性单元格赋值
if (pFeature.get_Value(j) == null)
dataR[j] = pFeatureClass.ShapeType.ToString();
else
dataR[j] = pFeature.get_Value(j);
}
//游标指向下一行要素
pFeature = pFeatureCursor.NextFeature();
}
return dt;
}

5. 空间查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;

//实例化一个过滤器,用来设置空间范围的查询条件
ISpatialFilter pSpatialFilter = new SpatialFilter();
IGeometry geometry = mapControl.TrackRectangle();
//将几何范围赋值给pSpatialFilter
pSpatialFilter.Geometry = geometry;
//设置空间范围的查询条件
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
//实例化查询接口
IFeatureSelection pfeatureSelection = pFeatureLayer as IFeatureSelection;
//实现高亮
pfeatureSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
mapControl.Refresh();//地图刷新

分值

  1. 填空:1*15
  2. 选择:2*10
  3. 简答:基本概念、总结及功能流程 4*5
  4. 程序阅读:改错、对象模型图 5*3
  5. 程序设计:2*15